1 区块链介绍

在需要确保安全的环境中,一般都需要一个中心化的机构来维护整个系统的运行,中心化也会带来一定的风险,如果中心化机构出现了问题,可能会带来系统奔溃,运行失常等问题。

为了解决中心化的问题,区块链(blockchain)应运而生。区块链是一种可以去中心化的技术,使系统内用户不需要统一经过某个中心机构的验证许可就可以正常的满足自己的需求。是借由密码学与共识机制等技术创建与存储庞大交易资料区块链的点对点网络系统。

2 区块链实验

2.1 区块链节点的创建

1.使用学号登录”国家未来智能网络试验设施创新试验服务平台”:https://ceni.ustc.edu.cn。

qkl-1

2.登录后,点击"试验控制台"→”我的试验”→”创建新试验”,填写试验名称及试验描述、选择试验分类。

qkl-2.png

3.点击下一步开始资源配置。将左侧”VM”拖动到右侧网格区域创建新的节点。”新增节点”添加节点。镜像选择”公有镜像”—”centos”—”Blockchain-Centos7”,其余配置参考下图。配置完成后点击”保存并复制节点”以增加同配置的其他节点,至少配置两个节点。

4.将鼠标悬浮在网格中界点上方,点击节点周围红色小圆圈并拖动与其他节点相连,右侧弹出链路信息,点击确认增加链路。添加链路保证所有节点互通,建议构建全联通网络。

5.设置完成后点击”创建试验”,创建成功后点击右上角的”运行试验”即可开始试验。

6.点击”打开控制台”,进入虚拟机登录界面,使用root账户登陆,密码见试验运行后界面。若打开控制台为如下界面,点击”未列出?”,依次输出用户名root及密码即可进入虚拟机。

2.2 区块链配置

上述是创建了节点,接下来部署区块链。整体流程为任意选择一个节点作为peer0,在其上生成其他节点的启动文件并发送给其余节点,最后启动所有节点,形成区块链网络。

1.进入任意一台虚拟机(如N1),记为peer0节点,在桌面右键,选择打开终端,输入指令systemctl start docker启动docker

$ systemctl start docker
$ docker images  # 当前无镜像

2.执行cd keda命令行进入keda文件夹,执行命令sh create.sh n(n为上述所创建的节点个数)生成所有节点的启动文件。

$ cd keda
$ sh create.sh 2

3.执行上述命令,稍等安装配置后

若终端出现如上图所示的输出,则在终端执行:

$ rm -f /var/run/yum.pid

4.在keda文件夹下会生成ethnet文件夹,拷贝此文件夹到/home路径下,执行命令:

$ cp -r ethnet/ /home/
# 进入`/home/ethnet/`文件夹下
$ cd /home/ethnet/

这里共有peer0-peer(n-1)个子文件夹,peer0文件夹里有本节点的区块链启动文件,其余peer文件依次存放着其余节点的启动文件。

5.需要更改每个文件夹下start.sh文件里的相关参数,可以通过vim指令进行更改,也可以直接进入相关文件夹用文本编辑器(geditnano)打开后进行更改

$ vi peer0/start.sh
#$ gedit peer0/start.sh
#$ nano peer0/start.sh
$ vi peer0/tendermint/config/priv_validator_key.json  # 按 j 到 address 所在行,在命令模式下,按下 guu 即可将本行所有大写改为小写
$ ifconfig eth0   # 查看当前节点IP地址

需要更改的参数如下:

  • --persistent_peers:需要连接的节点地址,即peer0的地址, peer0不需要这个参数,在peer0/tendermint/config/priv_validator_key.json里的address即为peer0的地址,注意需要将其中的大写字母全部改为小写字母,对于peer1等节点,地址值的@后面需要改成peer0IP地址
  • --tm-external_addr:本节点的IP地址,注意记住所更改的文件与节点的对应关系,即每个peer文件夹对应一个节点
  • --max_in_peers、—max_out_peers:节点支持的最大连接数,建议设置为总节点数
  • --select_count:选择共识节点,需小于等节点数量,建议设置为0(代表所有节点)

6.更改完成后将整个ethnet文件夹发送至其余所有节点的/home目录下,如要发送给IP为172.16.2.106的节点时,指令为:

$ cd ..
$ scp -r ethnet root@172.16.2.106:/home

7.在除peer0外节点的/home/ethnet/下进入其对应的peer文件夹,输入指令systemctl start docker启动docker,输入指令sh start.sh部署区块链,注意peer0节点已经启动过dcoker,直接在peer0节点的peer0目录下执行sh start.sh即可。

# peer1
$ cd /home/ethnet/peer1
$ systemctl start docker
$ sh start.sh

# peer0
$ cd /home/ethnet/peer0
$ sh start.sh

执行完毕后即完成了所有节点的区块链部署。在peer节点中执行以下命令可查看docker container是否启动成功。

$ docker ps

若未看到namepeer(n)的容器,可使用如下命令查看原因并针对性解决:

$ docker logs peer0
# 问题解决后
# 查看容器名
$ docker ps -a
# 删除已建立的container
$ docker container rm peer0
# 重新运行
$ cd /home/ethnet/peer0
$ sh start.sh

2.3 测试智能合约

1.打开peer0节点桌面上的主文件夹,进入example文件夹中,可以看到文件deploy.js,需要更改其中的第一个account值。目录peer0/tendermint/config/下文件initial_eth_account.json里的ethAccountsnadress值会被n个节点使用,用其余的任意一个地址替换掉deploy.js里的account值。

# terminal 1
$ cd /root/Example
$ vi deploy.js

# terminal 2
$ cd /home/ethnet/peer0/tendermint/config/
$ vi initial_eth_account.json
## 如本次试验复制第三个 ethAccounts 到 deploy.js 的第6行即第一个 account 中,后一个 account:'123'不要替换

2.在example文件夹执行命令:

$ cd /root/Example
$ node deploy.js

可以看到如下的输出。此合约是转账合约,把合约地址下的以太币,转到要转入账户的余额里。表示区块链功能可以正常使用。

root@usernameblockchain-test-1n1-3343 Example]# node deploy.js
web3-shh package will be deprecated in version 1.3.5 and will no longer be supported.
web3-bzz package will be deprecated in version 1.3.5 and will no longer be supported.
txHash:0x6be4cabc78fc19fa508c672abae80b12dc9b8612bc53b7eb5a311899994677c2
contractaddress:0x50b02aC771f50CED87303cda4d542A49f793A3C6

2.4 智能合约部署调用

1.编写合约

新建solc文件,在.solc文件内编写合约,注意预安装的solcjs版本是0.6.0,编写的合约版本要在0.6.0以下,否则可能编译不通过。也可重新安装solcjs新版本(打开主目录的configurationInstallTools.txt,按照solcjs安装命令安装即可)。

$ cd /root/Configuration
$ cat InstallTools.txt  # 查看 Install solcjs

2.编译合约

solcjs命令,可以编译智能合约

$ solcjs [path/to/合约] --optimize --bin --abi --output-dir [输出目录]

Example文件下的pay.solc合约

contract PayableDemo{
  constructor();//构造函数
  function transfer;//编写转账函数
  function showBalance();//显示余额函数
}
$ cd /root/Example
$ solcjs ./pay.solc --optimize --bin --abi --output-dir ./
$ ll

执行上述编译命令后,可以得到pay_solc_PayableDemo.abipay_solc_PayableDemo.bin文件。

3.部署合约

使用编译合约所生成的abibin文件部署合约

Example文件下的deploy.js文件

Contract =new web3.eth.Contract(abi文件内容);  //创建合约对象
web3.eth.personal.unlockAccount  //解锁账户函数,使用该账户部署合约

执行

$ node deploy.js

会得到交易哈希和合约地址,如

 txHash:0x818f1bfba08a6d2d61d6785af08794e201c0867e57d41374c428933fdef5bf3f
 contractaddress:0x52B61CA35ff74964EeF65D1405637371e5ba3B94

4.调用合约

使用abi文件及上述得到合约地址contractaddress可调用合约方法

$ vi callcontract.js
# 替换 contractAddress='0x' 为 contractAddress='0x52B61CA35ff74964EeF65D1405637371e5ba3B94'

然后在Example文件夹中执行

$ node callcontract.js
# 输出结果为
res: Result {}

3 区块链试验接口

3.1 JSON-RPC接口

主要是用来通过java来编写程序调用区块链的相关内容

web3协议json-rpc接口说明(英文):https://eth.wiki/json-rpc/API

3.2 web3j的相关接口函数

函数名 功能
web3.eth.getAccounts() 返回当前节点控制的账户列表
web3.eth.getBlockNumber() 返回当前块编号
web3.eth.getBalance(address) address: String - 要检查余额的账户地址 返回指定块中特定账户地址的余额
web3.eth.getBlockTransactionCount(string) 参数:String\ Number - 块编号或块的哈希值 返回指定块中的交易数量
web3.eth.getTransaction(transactionHash) 参数:String - 交易的哈希值 返回具有指定哈希值的交易对象
web3.eth.account.create() 创建一个账户对象

web3.js中文说明手册(javascript sdk):http://cw.hubwiz.com/card/c/web3.js-1.0/

web3.js中文说明手册(javascript sdk): https://web3js.readthedocs.io/en/v1.3.4/

4 常见问题说明

4.1 配置start.sh文件出错

若在执行sh start.sh指令后,发现start.sh文件配置出现问题,按以下步骤解决

$ docker stop $(docker ps -a -q)  # 停止所有容器
$ docker rm $(docker ps -a -q)  # 删除容器
# 修改start.sh文件后,重新启动容器并运行
$ sh start.sh

4.2 其他问题

如遇到docker容器问题且对docker不熟悉的情况下,请将目录/var/lib/docker/containers下的.log日志文件保留,通过虚拟机浏览器登陆邮箱将文件发送到自己电脑,然后搜索解决,如不能解决可在平台提工单。

如对容器比较熟悉,可自行用docker logs peer0查看问题并针对性解决。

致谢

本工作受到以下单位和项目的支持和帮助,特此致谢!

  • 1.上海能链众合科技有限公司提供的区块链底层设施
  • 2.第二批新工科研究与实践项目,面向“中国制造2025”的自动化新工科人才培养实践创新平台建设,E-ZDH20201613

results matching ""

    No results matching ""